import os
import subprocess
from pathlib import Path
from typing import Optional


def convert_to_wav(input_file: str, output_file: Optional[str] = None,
                   segment_convert: bool = False, start_time: str = "0:00:00",
                   end_time: str = "0:00:01") -> str:
    """
    使用FFmpeg将音频/视频文件转换为WAV格式

    参数:
        input_file (str): 输入文件路径
        output_file (str, optional): 输出文件路径。如果为None，则使用输入文件名加上.wav扩展名
        segment_convert (bool): 是否按时段转换，默认为False
        start_time (str): 开始时段，格式为"HH:MM:SS"，默认为"0:00:00"
        end_time (str): 结束时段，格式为"HH:MM:SS"，默认为"0:00:01"

    返回:
        str: 输出文件的路径

    异常:
        ValueError: 如果输入文件不存在或FFmpeg转换失败
    """
    if not os.path.exists(input_file):
        raise ValueError(f"输入文件不存在: {input_file}")
    
    if output_file is None:
        # 如果没有指定输出文件，则使用输入文件名加上.wav扩展名
        output_file = os.path.splitext(input_file)[0] + ".wav"
    
    # 确保输出目录存在
    output_dir = os.path.dirname(output_file)
    if output_dir and not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    try:
        # 构建FFmpeg命令
        ffmpeg_cmd = ["ffmpeg", "-i", input_file]

        # 如果启用时段转换，添加时间参数
        if segment_convert:
            ffmpeg_cmd.extend(["-ss", start_time, "-to", end_time])

        # 添加音频转换参数
        ffmpeg_cmd.extend([
            "-vn",  # 不包含视频（仅音频）
            "-acodec", "pcm_s16le",  # 使用16位小端PCM编码
            "-ar", "44100",  # 设置采样率为44100Hz
            "-y",  # 覆盖输出文件
            output_file
        ])

        subprocess.run(
            ffmpeg_cmd,
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        return output_file
    except subprocess.CalledProcessError as e:
        raise ValueError(f"FFmpeg转换失败: {e.stderr.decode('utf-8')}")
